// 定义构造函数
// function Person() {
//   this.name = 'zhichao'
//   this.sex = 'nan'
// }

// Person.prototype.say = function (msg) {
//   console.log('说话：', msg)
// }

// let p1 = new Person()
// p1.say()

class PersonC2 {

  // 普通属性
  // name
  // sex
   
  static love = '打篮球'

  constructor(name,sex){
    // 初始化已定义好类属性的值
      // 或者一次性初始化属性并且赋值,也可以完成复杂的属性赋值逻辑
      this.name = name
      this.sex = sex
  
    console.log('构造函数被调用:');
    
  }

  static sayLove(){
    // 3.0 静态方法的this指向的事类 而不是类的实例对象  ：PersonC2
    // 3.1在静态方法中调用静态属性 OK
    console.log(`我的爱好是：${this.love}`); 
    console.log(`我的爱好是：${PersonC2.love}`); 

    // 3.2在静态方法里边 使用this 调用普通的属性：调用不到  undefined
    console.log(`3.2在静态方法里边调用普通的属性:${this.sex}`);
    

    // 3.3在静态方法里边 使用this 调用普通的方法：不是一个函数
    // console.log(`3.2在静态方法里边调用普通的属性:${this.say('我是静态方法中...')}`);
    
  }

  sayHaha(){

    // 4.0 普通方法中的this 指向的是调用它的对象
    // 4.1 在普通方法中 使用this  调用静态属性:undefined
    console.log('4.1 在普通方法中 使用this  调用静态属性:',this.love);
    // 4.2 在普通方法中 使用this  调用静态方法: is not function
    // this.sayLove()

    // 5.在普通方法中 使用类名 直接调用静态的属性和方法
    console.log('&&&&&&&&&');
    console.log('5.在普通方法中调用静态的属性',PersonC2.love);
    PersonC2.sayLove()
    console.log('&&&&&&&&&');


  }

  // 普通方法
  say(msg){
    console.log(`姓名：${this.name},性别：${this.sex} ,说：${msg}`);
  }
}
// 1.1 使用类名调用静态的属性
console.log(PersonC2.love);
// 1.2 使用类名调用静态方法
PersonC2.sayLove()

console.log('-----------------------------');

let pc5 = new PersonC2('刘家锦','保密')
// 2.1使用实例化对象调用静态属性 获取不到值
console.log(pc5.love); // undefined
// pc5.sayLove() // pc5.sayLove is not a function


pc5.sayHaha()
console.log('-----------------------------');

console.log('-----------------------------');





class BingRen2  extends PersonC2{

  bingfang
  bingzheng

  // 2.私有属性
  #bingyin = ''


  constructor(bs,...arg){

    super(...arg)
    // this.bingfang = bf
    // this.bingzheng = bz
    // 1. 在构造函数中，使用对象解构的方式初始化属性
    {({ 
      bingfang:this.bingfang,
      bingzheng:this.bingzheng 
    } = bs)}

  }

  sayHi(status){
    console.log(`在 ${this.bingfang} 病房，病症是：${this.bingzheng}`);
    this.say(status)
    // 4.1私有方法的调用
    this.#sayBingyin()
  }


  // 2.1私有属性在类中调用1
  getBingyin(){
    return this.#bingyin
  }

  setBingyin(val){
    this.#bingyin = val
  }
  // 2.2私有属性在存取器调用
  // 3.存取器的使用
  get bingyin(){
    if (this.name === 'zhichao') {
      return this.#bingyin
    }else{
      return '未知'
    }
   
  }

  set bingyin(val){
    this.#bingyin = val
  }

  // 4.私有方法定义
  #sayBingyin(){
    console.log(`我的病因是：${this.#bingyin}`);
    
  }

}



let userobj1 = {
  name: 'chao00000',
  sex: 'nan',
  birthday: '2002-12-12',
  shenfenzheng: '2343253535422524',
}


let bingrenObj = {
  bingzheng:'便秘',
  bingyin:'吃甜食'
}

// 6.解构方式给对象新增属性
bingrenObj = {
  ...bingrenObj,
  bingfang:'1号'
}

console.log(bingrenObj,'bingrenObj');


// 创建对象
let br3 = new BingRen2(bingrenObj,'zhichao','man')
// 调用普通属性OK
console.log(br3.bingfang);
// 调用普通的方法来设置私有属性的值
br3.setBingyin('熬夜')
// 调用普通的方法
br3.sayHi('正在康复中')
// 使用普通方法获取私有属性
console.log(br3.getBingyin());

// 调用存取器设置私有属性的值
br3.bingyin = '吃甜食'
// 调用存取器获取私有属性的值
console.log(br3.bingyin);


let br4 = new BingRen2(bingrenObj,'xuewei','man')

br4.bingyin = '钻桌子'
console.log(br4.bingyin);

br4.sayHi('正在倒立罚站')






// let br1 = new BingRen('1号','精神病','zhichao','man')
// br1.sayHi('正在康复中。。')

// let br2 = new BingRen('抢救室','癫痫','cuimengjiao','girl')
// br2.sayHi('活蹦乱跳...')

// console.log('---------------------------------');


// let pc1 = new PersonC2('zhichao','man')
// pc1.say('好好学习')

// let pc2 = new PersonC2('cuimengjiao','girl')
// pc2.say('天天向上')
